package xj.config;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.ext.handler.ContextPathHandler;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.ehcache.EhCachePlugin;
import com.jfinal.template.Engine;

import xj.model._MappingKit;

public class Config extends JFinalConfig {
	
	static Prop p;
	   
	static void loadConfig() {
		if (p == null) {
			// 读取数据库配置文件
			p = PropKit.use("config.properties");
		}
	}

	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		loadConfig();
		
		// 设置当前是否为开发模式
		me.setDevMode(PropKit.getBoolean("devMode", false));
		// 设置默认上传文件保存路径 getFile等使用
		me.setBaseUploadPath(PropKit.get("uploadpath", "/upload"));
		// 默认下载路径
		me.setBaseDownloadPath(PropKit.get("downloadpath", "/download"));
		// 设置上传最大限制尺寸
		// me.setMaxPostSize(1024*1024*10);
		// 设置默认下载文件路径 renderFile使用
		// me.setBaseDownloadPath("");

		/**
		 * 尴尬的点：使用Undertow 不支持jsp
		 */
		// 设置404渲染视图
		// me.setError404View("/error/404.jsp");
		// me.setError500View("/error/500.jsp");
		
		// 支持 Controller、Interceptor 之中使用 @Inject 注入业务层，并且自动实现 AOP
		me.setInjectDependency(true);
	}

	public void configEngine(Engine me) {
		// 支持模板热加载，绝大多数生产环境下也建议配置成 true，除非是极端高性能的场景
		me.setDevMode(true);
		 
		// 添加共享模板函数  暂时不知道咋用
		me.addSharedFunction("pages/_sharedFunc.html");	
	}

	public void configHandler(Handlers me) {
		// 前端#(ctx) 等价  request.getContextPath()
		me.add(new ContextPathHandler("ctx"));
	}

	public void configInterceptor(Interceptors me) {
		
	}

	/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		// 配置 druid 数据库连接池插件
		DruidPlugin druidPlugin = createDruidPlugin();
		me.add(druidPlugin);
		
		// 配置ActiveRecord插件
		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
		arp.setShowSql(PropKit.getBoolean("devMode"));
		arp.setDialect(new MysqlDialect());
		// 配置属性名(字段名)大小写不敏感容器工厂
		arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));
		// 所有映射在 MappingKit 中自动化搞定
		_MappingKit.mapping(arp);
		me.add(arp);
		
		/**
		 * ehcache CacheKit.
		 */
		me.add(new EhCachePlugin());
	}
	
	public static DruidPlugin createDruidPlugin() {
		loadConfig();
		return new DruidPlugin(p.get("jdbcUrl"), p.get("username"), p.get("password").trim());
	}
	
	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		// 前端路由
		me.add(new FrontRoutes());
		// 后端路由
		me.add(new AdminRoutes());
	}

}
